<?php
/**
 * Linux下的TCPServer，在这里使用了平台相关的特性，非Linux系统可能无法使用
 * @author Administrator
 *
 */
class LinuxTCP
{
	public $main_pid;
	public $cfg;
	public $os;
	public $socket_life = 300;

	//会话上下文
	protected $context;
	//缓存输出
	protected $buffer;
	//记录系统时间
	public $server_time;

	function __construct($cfg)
	{
		$this->cfg = $cfg;
		$this->os = new Linux;
		$this->server_time = time();
	}
	/**
	 * 根据配置初始化服务器
	 */
	function init_pcntl()
	{
		if(isset($this->cfg['pcntl']['daemon']))
		{
			$this->daemon();
		}
		$this->main_pid = posix_getpid();
		if(isset($this->cfg['pcntl']['user']))
		{
			$user = posix_getpwnam($this->cfg['pcntl']['user']);
			$this->setuid($user['uid'], $user['gid']);
		}
		if(isset($this->cfg['pcntl']['pid_file']))
		{
			file_put_contents($this->cfg['pcntl']['pid_file'], $this->main_pid);
		}
		if(isset($this->cfg['pcntl']['chroot']))
		{
			chroot($this->cfg['pcntl']['chroot']);
		}
	}
	function init_signal()
	{
		if(isset($this->cfg['signal']['alarm_sec']))
		{
			$this->init_alarm();
		}
	}
	function signal_handler()
	{

	}
	function alarm_handler()
	{
		$this->run_check();
		$this->init_alarm();
	}
	function init_alarm()
	{
		$this->os->alarm($this->cfg['signal']['alarm_sec']);
		$this->os->signal(SIGALRM,array($this,'alarm_handler'));
		$this->server_time = time();
	}
	function keeplive($client_id)
	{
		$this->context[$client_id]['time'] = $this->server_time;
	}
	/**
	 * 清理socket
	 */
	function clean_socket()
	{
		if(empty($this->server->client_sock)) return true;
		foreach($this->server->client_sock as $k=>$fd)
		{
			//echo $this->context[$k]['time'],"\t",$this->socket_life,"\t",$this->server_time,"\n";
			if($this->context[$k]['time'] < $this->server_time-$this->socket_life) $this->server->close($k);
		}
	}
	/**
	 * 守护进程化
	 */
	function daemon()
	{
		$pid = pcntl_fork();
		if($pid<0) exit("Exit: Fork fail\n");
		elseif($pid == 0) exit(0);
	}
	/**
	 * 设置运行的uid,gid
	 * @param $uid
	 * @param $gid
	 */
	function setuid($uid,$gid)
	{
		posix_setuid($uid);
		posix_setgid($gid);
	}
}